// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2024-07-17

package src

var configFiles = []string{"redis.yml", "redis.yaml"}

const (
	DefaultHost         = "127.0.0.1"
	DefaultNetwork      = "tcp"
	DefaultPort         = 6379
	DefaultMaxActive    = 10
	DefaultMinIdle      = 2
	DefaultMaxLifetime  = 60
	DefaultTimeoutDial  = 5
	DefaultTimeoutRead  = 3
	DefaultTimeoutWrite = 3
)

// Config
// is a component used to parse configurations.
type Config struct {
	Network  string `yaml:"network"`
	Host     string `yaml:"host"`
	Port     int    `yaml:"port"`
	Password string `yaml:"password"`
	Database int    `yaml:"database"`

	MaxActive   int `yaml:"max-active"`
	MaxLifetime int `yaml:"max-lifetime"`
	MinIdle     int `yaml:"min-idle"`

	DialTimeout  int `yaml:"dial-timeout"`
	ReadTimeout  int `yaml:"read-timeout"`
	WriteTimeout int `yaml:"write-timeout"`
}

// After
// is an event handler that called by config.Resource, Do not call directly.
func (o *Config) After() {
	if o.Host == "" {
		o.Host = DefaultHost
	}
	if o.Network == "" {
		o.Network = DefaultNetwork
	}
	if o.Port == 0 {
		o.Port = DefaultPort
	}

	// Pool.
	if o.MaxActive == 0 {
		o.MaxActive = DefaultMaxActive
	}
	if o.MinIdle == 0 {
		o.MinIdle = DefaultMinIdle
	}
	if o.MaxLifetime == 0 {
		o.MaxLifetime = DefaultMaxLifetime
	}

	// Timeout.
	if o.DialTimeout == 0 {
		o.DialTimeout = DefaultTimeoutDial
	}
	if o.ReadTimeout == 0 {
		o.ReadTimeout = DefaultTimeoutRead
	}
	if o.WriteTimeout == 0 {
		o.WriteTimeout = DefaultTimeoutWrite
	}
}
